"""
=============================================================
        LangChain 聊天型 Prompt 模板示例
=============================================================

功能：
    - 演示如何使用 LangChain 构建多轮聊天消息模板。
    - 使用 SystemMessage、HumanMessagePromptTemplate、MessagesPlaceholder 等方式定义消息。
    - 支持模板变量和动态占位符，可根据输入生成不同的聊天上下文。
用途：
    - 构建多轮对话系统
    - 模拟人机对话，或作为 LLM 接口的前置 prompt 构建工具
示例：
    - 定义系统角色（system）
    - 定义人类消息（human）模板
    - 定义 AI 回复（ai）或动态占位符
"""

# -------------------------------
# 导入依赖
# -------------------------------
from langchain.prompts import HumanMessagePromptTemplate
from langchain_core.messages import SystemMessage, HumanMessage
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder

# -------------------------------
# 1️⃣ SystemMessage + HumanMessagePromptTemplate 示例
# -------------------------------
chat_template = ChatPromptTemplate.from_messages(
    [
        SystemMessage(
            content="你是一个乐于助人的助手，可以润色内容，使其看起来更简单易读。"
        ),
        HumanMessagePromptTemplate.from_template("{text}"),  # 模板变量 text
    ]
)

# 格式化消息
messages = chat_template.format_messages(text="我不喜欢吃好吃的东西")
print("示例1：SystemMessage + HumanMessagePromptTemplate")
print(messages)
print("\n" + "-"*50 + "\n")

# -------------------------------
# 2️⃣ 元组方式指定消息角色
# -------------------------------
chat_template2 = ChatPromptTemplate.from_messages(
    [
        ("system", "你是一个数学成绩特别差的学生"),
        ("human", "你好"),
        ("ai", "我很好"),
        ("human", "{user_input}")  # 模板变量 user_input
    ]
)

message2 = chat_template2.format_messages(user_input="今天怎么样？")
print("示例2：元组方式指定角色")
print(message2)
print("\n" + "-"*50 + "\n")

# -------------------------------
# 3️⃣ 使用 MessagesPlaceholder 占位符
# -------------------------------
chat_template3 = ChatPromptTemplate.from_messages([
    ("system", "你是一个很有知识的助手"),
    MessagesPlaceholder("msgs")  # 占位符 msgs
])

# 动态填充占位符
chat_template3.invoke({"msgs": [("human", "hello ketty")]})
print("示例3：MessagesPlaceholder 占位符")
print(chat_template3.messages)
print("\n" + "-"*50 + "\n")

# -------------------------------
# 4️⃣ 使用字符串占位符 "{msgs}"
# -------------------------------
chat_template4 = ChatPromptTemplate.from_messages([
    ("system", "你是一个很棒的助手"),
    ("placeholder", "{msgs}")  # 字符串占位符
])

chat_template4.invoke({"msgs": [("human", "hello ll")]})
print("示例4：字符串占位符")
print(chat_template4.messages)
print("\n" + "-"*50 + "\n")
